"use strict";

const path = require("path");
const AutoLoad = require("fastify-autoload");
const fs = require("fs");

//**一般情况下配置文件应该为.env，但我这里懒，单纯把配置放在了一个json文件里
//**然后使用fs和JSON解析获取本地配置参数
const jsonFs = fs.readFileSync("params.json");
const params = JSON.parse(jsonFs);

module.exports = async function (fastify, options) {
  // Place here your custom code!
  //fastify也有内置log，这里通过fastify.log引出并使用
  const log = fastify.log;
  log.level = "debug";

  // Place here your custom code!
  //第一步，链接数据库（配置sequelize链接），将连接信息配置至fastify中作为全局变量
  fastify
    .register(require("sequelize-fastify"), {
      //必填*：连接信息在全局变量中的名称
      instance: "sequelize",
      sequelizeOptions: {
        //要链接的数据库名称
        database: params.database.selectedDatabase,
        //必填*：要链接的数据库的类型
        dialect: params.database.type,
        //要登陆的数据库用户名
        username: params.database.username,
        //密码
        password: params.database.password,
        //sequelize原先直接console.log()的，换成fastify封装的log用
        logging: (sql) => {
          log.info(sql);
        },

        //其他选项
        options: {
          // host
          host: params.database.host,
          //端口
          port: params.database.port,
        },
      },
    })
    //fastify插件配置并注册成功后可以接着使用.ready()方法作为回调函数
    .ready(async () => {
      //这里我们使用.ready()来看一下数据库连接情况如何，并验证链接是否成功
      //注意这里已经可以通过fastify.sequelize直接获得到数据库连接信息了
      fastify.sequelize
        .authenticate()
        .then(() => {
          log.info("Connection has been established successfully.");
        })
        .catch((err) => {
          log.error("Unable to connect to the database:", err);
        });
    });

  //第二步，fastify配置config下的js文件，完成plugin注册
  //本项目暂未有更加深层的config.js使用，因此先注销本代码
  // loading configs (sequelize)
  // fastify.register(AutoLoad, {
  //   dir: path.join(__dirname, "config"),
  //   options: Object.assign({}, options),
  // });

  //第三步,fastify注册model下的sequelize model
  //经过此注册后，model.js里就可以正常使用fastify.sequelize来进行模型映射了
  // loading models (sequelize)
  fastify.register(AutoLoad, {
    dir: path.join(__dirname, "model"),
    options: Object.assign({}, options),
  });

  // Do not touch the following lines

  //第四步,fastify注册plugins，此代码在fastify项目init时会自动生成
  // This loads all plugins defined in plugins
  // those should be support plugins that are reused
  // through your application
  fastify.register(AutoLoad, {
    dir: path.join(__dirname, "plugins"),
    options: Object.assign({}, options),
  });

  //第五步,fastify注册routes，此代码在fastify项目init时会自动生成
  // This loads all plugins defined in routes
  // define your routes in one of these
  fastify.register(AutoLoad, {
    dir: path.join(__dirname, "routes"),
    options: Object.assign({}, options),
  });
};
